/**
 * 附加的效果 buff 削弱状态[增加设计难度]
 */

import { Role } from "./Role";

export enum EffectType { "buff", "debuff", "one" }

export abstract class Effect {
    public abstract type: EffectType

    /** 效果的总共持续时间 */
    public abstract sumTime: number;

    /** 效果的单次时间 */
    public abstract eachTime: number;

    /** 当前执行的数目 */
    public amount: number = 0;

    /** 定时器句柄 */
    private T: number = 0;
    /** 总共执行的数目 */
    public get sumAmount(): number {
        return Math.floor(this.sumTime / this.eachTime);
    }

    /** 具体的效果实现 */
    public abstract invoke(): void;

    /** 构造函数，传入一个 role 表示这个 effect 属于这个 role*/
    constructor(protected masterRole: Role) {

    }

    /** 激活这个效果，使其开始运作 */
    public active() {
        // 先调用一次，因为定时器刚开始不会执行。
        this.invoke()
        // 定时器启动，让 invoke 每隔 eachTime 执行一遍。
        this.T = setInterval(() => {
            this.amount++;
            this.invoke()
        }, this.eachTime) as unknown as number;
        // 启动一个定时器，让其在 sumTime 之后清除上面的定时器。
        setTimeout(() => {
            this.clear();
            this.masterRole.removeEffect(this);// 这个 effect 已经结束，让 role 删除它。
        }, this.sumTime - 10);
    }
    /** 清除这个效果 */
    public clear() {
        clearInterval(this.T);
    }
}

/**
 * 仅仅表示 Effect 的子类，实际执行过程中不会被创建、运行
 */
// @ts-ignore
export class EffectSubClass extends Effect { };

/**
 * 增益Buff
 */
export abstract class Buff extends Effect {
    public type = EffectType.buff
}

/**
 * 减益Buff
 */
export abstract class Debuff extends Effect {
    public type = EffectType.debuff

}